
#include "ProductorAcciones.h"

using namespace std;

ProductorAcciones::ProductorAcciones(bool atributo) : Thread(atributo){
	this->conexion 	= NULL;
}

ProductorAcciones::~ProductorAcciones() {
	free(this);
}
//Setters
void ProductorAcciones::setConexion(Socket *conexion){
	this->conexion = conexion;
}

//Manejador de señales de interrupcion.
void ProductorAcciones::signalHandler(int signal){
	if(signal == SIGURG){
		//Informo la finalizacion por sysout
		cout<< "[INFO] - Se cierra el hilo de respuesta a la partida. "<< endl;
		//Cierro el thread.
		pthread_exit(NULL);
	}
}

void ProductorAcciones::run (){
	/* Me attacho a la señal que envia el server para finalizar. */
	signal(SIGABRT,  ProductorAcciones::signalHandler);
	signal(SIGFPE,  ProductorAcciones::signalHandler);
	signal(SIGILL,  ProductorAcciones::signalHandler);
	signal(SIGTERM,  ProductorAcciones::signalHandler);
	signal(SIGURG, ProductorAcciones::signalHandler);

	/* Mientras el cliente este activo */
	while (Partida::getInstance()->isActivo()&& !Partida::getInstance()->isFinTorneo()) {
		/* Desencolo la respuesta generada */
		t_accion toSend = Partida::getInstance()->desencolarAccionAEnviar();

		if(!Partida::getInstance()->isStoped())
			if(this->conexion->write(((void *)&toSend), sizeof(toSend), this->conexion->getSocketId()) == -1){
				Partida::getInstance()->setActivo(CONST_FALSE);
				cout << "[ERROR] - No se pudo enviar una accion a la partida. " <<  endl;
			}

		usleep(50000);
	}

	//Cierro el thread.
	pthread_exit(NULL);
}
	
